package com.fdb.efp.batch.service.util;

import com.fdb.basic.framework.core.util.SFTPUtil;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSchException;
import org.apache.commons.vfs.FileSystemException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Objects;
import java.util.Vector;

/**
 * 从前置服务器下载文件: <br>
 * <p>
 * 0.1:caoxin:2019/5/13 17:08: TODO: <br>
 *
 * @author caoxin
 * @version 0.1
 * @date 2019/5/13 17:08
 * @since 2019/5/13 17:08
 */
public class DownFileUtils {
    private static Logger logger = LoggerFactory.getLogger(DownFileUtils.class);

    /**
     *
     * @param ip 文件所在ip
     * @param port 文件所在端口号
     * @param username 用户名
     * @param password 密码
     * @param remoteFilePath 远程文件目录
     * @param localFilePath 本地文件目录
     * @return
     * @throws Exception
     */
    public static boolean downloadFile(String ip,int port,String username,String password,String remoteFilePath,String localFilePath) throws Exception {
        // 连接前置文件服务器
        SFTPUtil sftpUtil = null;
        // 下载文件是否成功
        boolean fileDownRes = false;
        int downTotal = 0;
        try {
            // 从前置文件服务器下载文件到本地
            logger.info("从前置文件服务器信息：" + username + " / " + password + " IP: " + ip + " 端口号：" + port);
            logger.info("从前置文件服务器下载文件到本地");
            sftpUtil = new SFTPUtil(username, password, ip, port);
            // 检测解析目录是否有需要解析的文件存在
            logger.info("检测解析目录是否有需要解析的文件存在，前置文件服务器：下载地址" + remoteFilePath);
            Vector<ChannelSftp.LsEntry> files = sftpUtil.ls(remoteFilePath);
            Objects.requireNonNull(files);

            for (ChannelSftp.LsEntry file : files) {
                String fileName = file.getFilename();// 下载文件名
                logger.info("下载文件名:" + file.getFilename());
                if (".".equals(fileName) || "..".equals(fileName)) {
                    continue;
                } else {
                    try {
                        boolean singleFileDownRes = sftpUtil.downFile(sftpUtil, remoteFilePath, file.getFilename(),
                                localFilePath, file.getFilename(), false);
                        logger.info("下载文件：" + remoteFilePath + file.getFilename() + "，结果[" + singleFileDownRes + "]");
                        if (singleFileDownRes) {
                            // 下载文件数
                            downTotal++;
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        logger.error("前置文件服务器下载文件出现异常：" + e.getMessage());
                    }
                }
            }
            // 下载文件数大于0，则解析
            if (downTotal > 0) {
                fileDownRes = true;
            }
            logger.info("本次前置文件服务器下载文件数目：[" + downTotal + "]");
        } catch (FileSystemException e) {
            logger.error("前置文件服务器下载文件出现异常：" + e.getMessage());
            e.printStackTrace();
        } catch (JSchException e) {
            logger.error("前置文件服务器下载文件出现异常：" + e.getMessage());
            e.printStackTrace();
        } catch (Exception e) {
            logger.error("前置文件服务器下载文件出现异常：" + e.getMessage());
            e.printStackTrace();
        } finally {
            if (sftpUtil != null) {
                sftpUtil.closeSFTP();
            }
        }
        return fileDownRes;
    }
}
